<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body{
            padding-bottom: 800px;
            padding-left: 30px;
        }
        .box{
            border: 1px solid black;
            padding: 20px;
            display: inline-block;
            background-color: white;
            user-select: none;
        }
        .box:active{
            background-color: rgba(165, 42, 42, 0.1);
        }
    </style>
</head>
<body>
    <h2>非vue环境</h2>
    <!-- 
        1. 默认事件功能 : DOM自带具有相关功能的事件  a form  input-submit  input-reset
        2. 事件传播(事件流) : DOM元素是以嵌套方式完成的结构定义树，在JS事件处理时，
                             无论DOM元素是否绑定了对应事件，触发的事件一定会从当前元素开始向外一层一层调用
                             在事件传播过程中，子元素对应的事件被触发后，如果祖先元素定义相同的事件方法，该方法也会被执行
        3. 事件冒泡 : 在事件传播过程中，事件回调基于层级关系 由内向外依次触发
        4. 事件捕获 : 在事件传播过程中，事件回调基于层级关系 由外向内依次触发 (不是JS的默认事件功能)
                      捕获事件回调优先于冒泡事件回调
        5. 事件委托(事件代理) : 在事件传播的机制下，完成事件的统一定义和管理
    -->
    <a href="https://www.baidu.com">百度</a>
    <a href="https://www.baidu.com">百度</a>
    <a href="">刷新页面</a>
    <br>
    <a>百度</a>
    <a href="javascript:void(0)">百度</a>
    <a href="javascript:">百度</a>
    <a href="" onclick="return false">刷新页面</a>
    <a href="" onclick="preventEvent(event)">刷新页面</a>
    <script>
        function preventEvent(e){
            console.log("preventEvent",e)
            // event.preventDefault 方法用于停止事件的默认功能 -- 阻止默认事件
            e.preventDefault()
        }
    </script>

    <hr>
    <div id="app">
        <h2>vue环境</h2>
        <h3>事件功能修饰符</h3>
        <!-- 
            .prevent ： 为事件添加阻止默认事件功能（调用js event.preventDefault()）
        -->
        <a href="" @click="preventEvent($event)">刷新页面</a> <br>
        <a href="" @click.prevent="preventEvent2()">刷新页面</a>

        <hr>
        
        <div class="box" @click="printName('A')">A
            <div class="box" @click="printName('B')">B
                <div class="box" @click="printName('C')">C
                    <div class="box" @click="printName('D')">D
                        <div class="box" @click="printName('E')">E</div>
                    </div>
                </div>
            </div>
        </div>
        <hr>
        <!-- .stop ： 为事件添加阻止事件冒泡(方法执行)特性（调用js event.stopPropagation()） -->
        <div class="box" @click="printName('A')">A
            <div class="box" @click="printName('B')">B
                <div class="box" @click.stop="printName('C')">C
                    <div class="box" @click="printName('D')">D
                        <div class="box" @click="printName('E')">E</div>
                    </div>
                </div>
            </div>
        </div>

        <hr>
        <!-- .capture ：改变事件执行顺序，将冒泡事件转换为事件捕获 -->
        <div class="box" @click.capture="printName('A')">A
            <div class="box" @click.capture="printName('B')">B
                <div class="box" @click.capture.stop="printName('C')">C
                    <div class="box" @click.capture="printName('D')">D
                        <div class="box" @click.capture="printName('E')">E</div>
                    </div>
                </div>
            </div>
        </div>
        <hr>
        <div class="box" @click="printName('A')">A
            <div class="box" @click.capture="printName('B')">B
                <div class="box" @click.stop="printName('C')">C
                    <div class="box" @click.capture="printName('D')">D
                        <div class="box" @click="printName('E')">E</div>
                    </div>
                </div>
            </div>
        </div>
        <hr>
        <!-- 页面列表的数量由后端数据提供进行渲染并提供事件功能，但数据量较大，导致页面假死，问题如何优化 -->
        <!-- <ul>
            <li @click="printMsg()">item1</li>
            <li @click="printMsg()">item2</li>
            <li @click="printMsg()">item3</li>
            <li @click="printMsg()">item4</li>
            <li @click="printMsg()">item5</li>
            <li @click="printMsg()">item6</li>
            <li @click="printMsg()">item7</li>
            <li @click="printMsg()">item8</li>
            <li @click="printMsg()">item9</li>
            <li @click="printMsg()">item10</li>
        </ul> -->
        <ul @click="printMsg()">
            <li>item1</li>
            <li>item2</li>
            <li>item3</li>
            <li>item4</li>
            <li>item5</li>
            <li>item6</li>
            <li>item7</li>
            <li>item8</li>
            <li>item9</li>
            <li>item10</li>
        </ul>
    </div>
    <script type="module">
        // 加载 Vue3 的ESM 模块文件
        import { createApp } from "../assets/vue3/vue.esm-browser.js"
        createApp({
            data(){
                return {
                    
                }
            },
            methods:{
                preventEvent(e){
                    console.log("vue的preventEvent")
                    e.preventDefault()
                },
                preventEvent2(){
                    console.log("vue的preventEvent")
                },
                printName(name){
                    console.log(name,"元素");
                },
                printMsg(){
                    console.log("printMsg")
                }
            }
        }).mount("#app")
    </script>
</body>
</html>